#include "dfsthread.h"
#include <QDebug>

const int DfsThread::dx[4] = {0, 0, 1, -1};
const int DfsThread::dy[4] = {1, -1, 0, 0};

DfsThread::DfsThread(QWidget *parent)
    : QThread(parent)
    , map(nullptr)
{
}

void DfsThread::init(QVector<QVector<MapSquare*>>& _map, int _r, int _c, int _max_step)
{
    map = &_map;
    src_r = _r;
    src_c = _c;
    max_step = _max_step;
    r_map = _map.size();
    c_map = _map[0].size();
    // 这里每次都得重新设置一下
    visited = QVector<QVector<bool>>(r_map, QVector<bool>(c_map, false));
}

void DfsThread::pause()
{
    QMutexLocker locker(&mutex);
    paused = true;
}

void DfsThread::resume()
{
    QMutexLocker locker(&mutex);
    paused = false;
    pauseCond.wakeAll();
}

void DfsThread::run()
{
    {
        QMutexLocker locker(&mutex);
        while (paused) {
            pauseCond.wait(&mutex);
        }
    }
    if (!map) return;

    if (false == dfs(src_r, src_c, 0, max_step)){
       emit dstNotFound();
    }
}

bool DfsThread::dfs(int r, int c, int step, int max_step)
{
    {
        QMutexLocker locker(&mutex);
        while (paused) {
            pauseCond.wait(&mutex);
        }
    }

    if (step > max_step) return false;
    if (r < 0 || r >= r_map || c < 0 || c >= c_map) return false;
    if (visited[r][c]) return false;

    const QVector<QVector<MapSquare*>>& mapRef = *map;
    if (mapRef[r][c]->status() == MapSquare::STATUS_UNCHECKABLE) return false;
    // 标记为已访问
    visited[r][c] = true;

    qDebug() << r << ' ' << c << ' ' << step; // 测试用, 可以不要

    // 检查是否找到目标 (不同阵营)
    if (mapRef[r][c]->unit_type() != MapSquare::UNIT_TYPE_EMPTY &&
        mapRef[r][c]->unit_type() != mapRef[src_r][src_c]->unit_type()) {
        // 找到目标！
        emit updateSquare(r, c, MapSquare::STATUS_ATTACK);
        mapRef[r][c]->setSrc(src_r, src_c);
        QThread::msleep(300);
        return true;  // 成功找到路径
    }

    if(mapRef[r][c]->status() != MapSquare::STATUS_MOVE){
        emit updateSquare(r, c, MapSquare::STATUS_MOVE);
        mapRef[r][c]->setSrc(src_r, src_c);
        if(one_step) {
            pause();
        } else {
        QThread::msleep(50); // 暂停一段时间
        }
    }

    for (int i = 0; i < 4; i++) {
        int x = dx[i] + r;
        int y = dy[i] + c;

        if (dfs(x, y, step + 1, max_step)) {
            // 到了这里, 说明找到了
            // 那么接着修改地格状态, 并返回 true
            emit updateSquare(r, c, MapSquare::STATUS_ATTACK);
            QThread::msleep(300);
            return true;
        }
    }

    // 恢复状态
    visited[r][c] = 0;
    return false;
}

void DfsThread::oneStep(bool o)
{
    one_step = o;
}
